package net.lzzy.practices.services;

import net.lzzy.practices.constants.Messages;
import net.lzzy.practices.entities.Course;

import java.util.List;
import java.util.UUID;

/**
 * @author HUAWEI
 */
public interface CourseService {
    /**
     * 获取所有课程
     * @return 课程集合
     */
    List<Course> get();

    /**
     * 分页获取所有课程
     * @param page 页码
     * @param size 每页大小
     * @return 当前页课程集合
     */
    List<Course> get(int page,int size);

    /**
     * 获取所有开放/未开放的课程
     * @param open 是否开放课程
     * @return 符合条件的课程集合
     */
    List<Course> get(boolean open);

    /**
     * 分页获取开放/未开放的课程
     * @param page 页码
     * @param size 每页大小
     * @param open 是否开放
     * @return 符合条件的当前页码课程集合
     */
    List<Course> get(int page,int size,boolean open);

    /**
     * 课程数量
     * @return 课程总数
     */
    Integer count();
    /**
     * 开放/未开放课程数量
     * @param open 是否开放
     * @return 课程数量
     */

    Integer count(boolean open);

    /**
     * 根据id获取课程对象
     * @param id 课程id
     * @return 课程对象
     */
    Course getById(UUID id);

    /**
     * 获取某教师的所有课程
     * @param teacherId 教师id
     * @return  课程集合
     */
    List<Course> getTeachersCourse(UUID teacherId);

    /**
     * 获取某学生的所有课程
     * @param studentId 学生id
     * @return 课程集合
     */
    List<Course> getStudentsCourses(UUID studentId);

    /**
     * 教师创建新课程
     * @param course 新课程对象
     * @return 创建好的课程对象
     */
    Course add(Course course);

    /**
     * 更新课程
     * @param course 课程对象
     * @param token 操作人令牌
     * @return 更新后的课程对象
     */
    Course update(Course course,String token);

    /**
     * 课程创建者开放/关闭课程
     * @param id 课程对象
     * @param token 操作人令牌
     * @return 操作后的课程对象
     */
    Course openCloseCourse(UUID id, boolean open, String token);

    /**
     * 删除课程
     * @param id 要删除的课程id
     * @param token 操作人令牌
     * @return 删除成功与否的消息
     */
    Messages remove(UUID id,String token);
}
